package com.aitemv.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.aitemv.base.BaseEntity;

/**
 * 
 * @ClassName: CommUtil
 * @Description: 公共的util类
 * @author java_lyvee@126.com
 * @date 2014-1-9 下午7:14:51
 * 
 */
public class CommUtil {
	/**
	 * @Title: conditSql
	 * @Description: 构造sql的方法
	 * @param o
	 * @return String 返回类型
	 */
	public static String conditSql(Map<String, String> o) {
		StringBuffer tempSql = new StringBuffer();
		for (String s : o.keySet()) {
			String val = o.get(s);
			tempSql.append(" and a." + s + val + "?");
		}
		return tempSql.toString();
	}

	/**
	 * @param <T>
	 * @Title: conditSqlFieldByEntity
	 * @Description: 通过反射构造出sql语句的查询字段(所有字段)
	 * @param entity
	 * @return String 返回类型
	 */
	public static <T extends BaseEntity> String conditSqlFieldByEntity(
			BaseEntity entity) {
		/**
		 * setup1、获得到实体类的class
		 */
		@SuppressWarnings("unchecked")
		Class<T> clazz = (Class<T>) entity.getClass();
		/**
		 * setup2、通过clazz获得到实体的fields即所有的属性
		 */
		Field[] fields = clazz.getDeclaredFields();
		if (fields == null || fields.length == 0) {
			return "";
		}
		int mod = 0;// 实体类的修饰类型
		StringBuffer tempSqlField = new StringBuffer();
		/**
		 * setup3、循环所有属性然后拼装sql语句所需要查询的字段
		 */
		for (Field field : fields) {
			mod = field.getModifiers();
			if (Modifier.isPrivate(mod)) {// 只有被private修饰的属性才拼装
				tempSqlField.append("," + field.getName());
			}
		}
		return tempSqlField.toString().substring(1,
				tempSqlField.toString().length());
	}

	/**
	 * @Title: conditFieldByEntity
	 * @Description: 通过反射获得到实体所有属性
	 * @param entity
	 * @return list
	 * @return String 返回类型
	 */
	public static <T extends BaseEntity> List<String> conditFieldByEntity(
			BaseEntity entity) {
		@SuppressWarnings("unchecked")
		Class<T> clazz = (Class<T>) entity.getClass();
		Field[] fields = clazz.getDeclaredFields();
		List<String> list = new ArrayList<String>();
		int mod = 0;// 实体类的修饰类型
		if (fields == null || fields.length == 0) {
			return list;
		} else {
			for (Field field : fields) {
				mod = field.getModifiers();
				if (Modifier.isPrivate(mod)) {// 只有被private修饰的属性才拼装
					list.add(field.getName());
				}
			}
		}
		return list;

	}
	/**
	 * @Title: conditFieldByEntity 
	 * @Description: 通过反射获得到实体所有属性
	 * @param clazz
	 * @return  list
	 * @return List<String>  返回类型
	 */
	public static <T extends BaseEntity> List<String> conditFieldByEntity(Class<? extends BaseEntity> clazz) {
		Field[] fields = clazz.getDeclaredFields();
		List<String> list = new ArrayList<String>();
		int mod = 0;// 实体类的修饰类型
		if (fields == null || fields.length == 0) {
			return list;
		} else {
			for (Field field : fields) {
				mod = field.getModifiers();
				if (Modifier.isPrivate(mod)) {// 只有被private修饰的属性才拼装
					list.add(field.getName());
				}
			}
		}
		return list;

	}
}
